"""
@author: Charles Tim Garrocho
@contact: ctgarrocho@gmail.com
@copyright: (C) 2012-2012 Python Software Open Source
"""

from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread
from Detector import DetectorMovimentos
import cv2.cv as cv
from os import remove
from recursos import Config

DETECTOR = DetectorMovimentos()

def statusMonitoramento(conexao):
    conexao.send(Config.OK_200)
    if DETECTOR.EXECUTANDO:
        conexao.send(Config.EXECUTANDO)
    elif DETECTOR:
        conexao.send(Config.PAUSADO)

def iniciar(conexao):
    
    conexao.send(Config.OK_200)
    DETECTOR.EXECUTANDO = True
    
    while DETECTOR.EXECUTANDO:
        
        imagem = DETECTOR.obterImagemCam()
        DETECTOR.processaImagem(imagem)
        
        if DETECTOR.verificaMovimento():
            print 'tem movimento'

            # Exibe a imagem na janela webCam e salva a imagem no diretorio corrente com nome da data e horario atual.
            #DETECTOR.ShowImage('webCam', self.imagem_atual)
            # cv.SaveImage(self.obterHoraAtual(), imagem)
            
def obterImagemAtual(conexao):
    
    endereco = DETECTOR.obterHoraAtual()
    cv.SaveImage(endereco, DETECTOR.imagem_atual)
        
    imagem = open(endereco)
    conexao.send(Config.OK_200)
    
    while True:
        dados = imagem.read(512)
        if not dados:
            break
        conexao.send(dados)
    
    imagem.close()
    remove(endereco)

def trataCliente(conexao, endereco):
    
    requisicao = conexao.recv(1)
    print requisicao
    
    if requisicao == Config.STATUS:
        statusMonitoramento(conexao)
    
    elif requisicao == Config.INICIAR:
        iniciar(conexao)
        
    elif requisicao == Config.PAUSAR:
        conexao.send(Config.OK_200)
        DETECTOR.EXECUTANDO = False
        
    elif requisicao == Config.IMAGEM:
        obterImagemAtual(conexao)
    
    else:
        conexao.send(Config.NAO_AUTORIZADO_401)
        
    conexao.close()

def servidor():
    soquete = socket(AF_INET, SOCK_STREAM)
    soquete.bind((Config.HOST, Config.PORTA))
    soquete.listen(1)
    
    while True:
        Thread(target = trataCliente, args = (soquete.accept()) ).start()

if __name__== '__main__':
    Thread(target = servidor).start() 